package cn.smxy.works.service;

import cn.smxy.param.*;
import cn.smxy.pojo.Category;
import cn.smxy.pojo.Plant;
import cn.smxy.pojo.PlantPicture;
import cn.smxy.util.R;
import cn.smxy.vo.PlantVo;

import java.util.List;

public interface PlantService {
    /**
     * 上传植物作品
     * 1.设置植物信息初始值
     * 2.保存植物信息
     * 3.保存图片信息
     * 4.发送信息，让es同步数据
     * @param plantAddParam
     * @return
     */
    R add(PlantAddParam plantAddParam);

    /**
     * 删除植物作品
     * 1.只能删除发布30天以内的作品，且不能是官方认证作品
     * 2.比对用户id和植物id
     * 3.删除植物
     * 3.1 发送信息通知es同步数据
     * 3.2 通知评论服务删除对应数据
     * 3.3 通知热度服务删除对应数据
     * 3.4 通知收藏服务删除对应数据
     * 3.5 如果是校园认证植物，通知校园服务删除对应数据
     * @param plantRemoveParam
     * @return
     */
    R remove(PlantRemoveParam plantRemoveParam);

    /**
     * 修改植物作品
     * 1.1 官方认证的作品不能修改
     * 1.2 可以修改植物名，植物别名，拉丁名，种群，科属，描述，地址
     * 2.更新数据
     * 3.发送信息通知es同步数据
     * @param plant 植物实体类
     * @return
     */
    R update(Plant plant);

    /**
     * 植物作品校园认证
     * 1.条件封装
     * 2.调用college服务保存校园植物作品
     * @param plantCampusParam 用户id，植物id，学校id，校园内地址
     * @return
     */
    R campus(PlantCampusParam plantCampusParam);

    /**
     * 查看植物图片集(多张图片)
     * @param plantId 植物id
     * @return 植物图片集合
     */
    R picture(Long plantId);

    /**
     * 单种群多科属分页展示
     * @param plantPageParam 分页参数
     * @return
     */
    R page(PlantPageParam plantPageParam);

    /**
     * 查看植物详情
     * 1.查询数据库
     * 2.结果封装并返回
     * @param plantId 植物id
     * @return
     */
    R detail(Long plantId);

    /**
     * es搜索
     * @param plantSearchParam
     * @return
     */
    R search(PlantSearchParam plantSearchParam);

    /**
     * 展示所有植物图片
     * @param search
     * @return
     */
    List<PlantPicture> pictureAll(String search);

    /**
     * 获取植物信息
     * 由校园模块调用
     * @param plantId
     * @return
     */
    PlantVo info(Long plantId);

    /**
     * 获取所有植物列表
     * @return
     */
    List<Plant> list();

    /**
     * 获取各种群作品数量
     * @param list
     * @return
     */
    int[] getCount(List<Category> list);

    /**
     * 删除用户对应作品
     * @param userId
     * @return
     */
    R removeByUserId(Long userId);
}
